package com.googlecode.maratische.google.model;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.SwingUtilities;

import org.apache.log4j.Logger;

import be.lechtitseb.google.reader.api.core.GoogleReader;
import be.lechtitseb.google.reader.api.model.exception.GoogleReaderException;
import be.lechtitseb.google.reader.api.model.feed.ItemDescriptor;
import be.lechtitseb.google.reader.api.util.GoogleReaderUtil;

import com.googlecode.maratische.google.BaseException;
import com.googlecode.maratische.google.DaoAction;
import com.googlecode.maratische.google.MainController;
import com.googlecode.maratische.google.utils.StringUtils;

public class CommandUpdateFeedOffline extends Command {
	static Logger logger = Logger.getLogger(CommandUpdateFeedOffline.class.getName());

	@Override
	public String getType() {
		return Commands.UpdateFeedOffline.toString();
	}

	@Override
	public Integer getPriority() {
		return 3;
	}

	@Override
	public boolean execute(final DaoAction daoAction) throws BaseException, GoogleReaderException, SQLException {
		String result = null;
			List<Integer> existIds = new ArrayList<Integer>();
			GoogleReader googleReader = getGoogleReader(daoAction);
				Feed feed = daoAction.getFeedDao().findByFeedDescriptorId(getString1());
				if (feed != null) {
					//получаем количество элементов и округляем до ближайшей сотни.
					int k = daoAction.getItemDao().countItemsByFeedIdUnread(feed.getId());
					k = (1 + k / 100)*100;
					//делим на 2, так как далее произойдет умножение на 2
					k = k/2;
					List<ItemDescriptor> items = null;
					do {
						k *= 2;
						result = getUnreadItems(googleReader, feed, k);
						items = GoogleReaderUtil.getItemDescriptorsFromItemsXml(result);
					} while (items.size() == k && items.size() < 2000);
					for (ItemDescriptor itemDescription : items) {
						Item item = new Item(itemDescription);
						item.setFeedId(feed.getId());
						if (item.getLink()!= null) {//очень странно, что линк вообще может быть равен null
							List<Item> list = daoAction.getItemDao().findByLink(item.getLink());
							if (list == null || list.size()==0) {
								item = daoAction.getItemDao().save(item);
								existIds.add(item.getId());
								findMediaResource(item, daoAction);
	/*						} else if (list.get(0).isRead()) {
								item = list.get(0);
								item.setRead(false);
								daoAction.getItemDao().save(item);
								existIds.add(item.getId());
								пока отменим данное решение, так как при синхонизации, если еще не ушли READ_ITEM
								новость помечается как не прочитанная
								надо или проверять на наличие комманд READ_ITEM, которые ще не ушли
								или при отправке READ_ITEM проверять такие ситуации
								TODO
								*/
							} else {
								existIds.add(list.get(0).getId());
							}
						}
					}
					daoAction.getItemDao().removeReadedItem(feed.getId(),existIds);
				}
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					MainController.getMainController().updateItemsPanel();
					MainController.getMainController().updateFeedMenu();
				}
			});
			return true;
	}

	protected String getUnreadItems(GoogleReader googleReader, Feed feed, int k) throws GoogleReaderException {
		return googleReader.getApi().getUnreadItems(feed.getFeedDescriptorId(), 100*k);
	}
	
	protected void findMediaResource(Item item, DaoAction daoAction) throws SQLException, BaseException {
		String description = item.getDescription();
		if (description != null && description.length()>0) {
			String temp = null;
			while ( (temp = StringUtils.getBetweenString(description, "<img ", ">")) != null) {
				description = StringUtils.getAfterString(description, "<img ", ">");
				String url = StringUtils.getBetweenString(temp+" ", "src=", " ");
				if (url != null && url.length()>1) {
					if ("\"".equals(url.substring(0,1))){
						url = url.substring(1);
					}
					if ("/".equals(url.substring(url.length()-1,url.length()))){
						url = url.substring(0,url.length()-1);
					}
					if ("\"".equals(url.substring(url.length()-1,url.length()))){
						url = url.substring(0,url.length()-1);
					}
//					logger.debug("parsed url " + url);
					CommandUpdateItemMedia command = (CommandUpdateItemMedia)Command.createCommand(Commands.UpdateItemMedia);
					command.setString1(item.getId().toString());
					command.setString2(url);
					daoAction.getCommandDao().save(command);
				}
//				String temp = description.indexOf(ch)
			}
		}
	}

}
